From fa56127586d9bb07d929147f83815e603dce0507 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 15 Jan 2015 00:20:56 -0800 Subject: [PATCH] Allow configuration of jobs by default via build.jobs Continuation of #1114 Closes #1108 --- src/cargo/ops/cargo_compile.rs | 22 ++++++++++++-- src/doc/config.md | 3 ++ tests/test_bad_config.rs | 54 ++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index d4827c37d..3e70b84c1 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -22,9 +22,10 @@ //! previously compiled dependency //! -use std::os; use std::collections::HashMap; use std::default::Default; +use std::num::ToPrimitive; +use std::os; use std::sync::Arc; use core::registry::PackageRegistry; @@ -188,8 +189,25 @@ fn source_ids_from_config(config: &Config, cur_path: Path) fn scrape_build_config(config: &Config, jobs: Option, target: Option) -> CargoResult { + let cfg_jobs = match try!(config.get_i64("build.jobs")) { + Some((n, p)) => { + match n.to_u32() { + Some(n) => Some(n), + None if n <= 0 => { + return Err(human(format!("build.jobs must be positive, \ + but found {} in {:?}", n, p))); + } + None => { + return Err(human(format!("build.jobs is too large: \ + found {} in {:?}", n, p))); + } + } + } + None => None, + }; + let jobs = jobs.or(cfg_jobs).unwrap_or(os::num_cpus() as u32); let mut base = ops::BuildConfig { - jobs: jobs.unwrap_or(os::num_cpus() as u32), + jobs: jobs, requested_target: target.clone(), ..Default::default() }; diff --git a/src/doc/config.md b/src/doc/config.md index af008b1b1..66a48789c 100644 --- a/src/doc/config.md +++ b/src/doc/config.md @@ -74,4 +74,7 @@ token = "..." # Access token (found on the central repo's website) [http] proxy = "..." # HTTP proxy to use for HTTP requests (defaults to none) timeout = 30000 # Timeout for each HTTP request, in milliseconds + +[build] +jobs = 1 # number of jobs to run by default (default to # cpus) ``` diff --git a/tests/test_bad_config.rs b/tests/test_bad_config.rs index 3e644293c..ad179ecd5 100644 --- a/tests/test_bad_config.rs +++ b/tests/test_bad_config.rs @@ -87,3 +87,57 @@ Caused by: expected a string, but found a boolean in [..]config ")); }); + + +test!(bad_cargo_config_jobs { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + "#) + .file("src/lib.rs", "") + .file(".cargo/config", r#" + [build] + jobs = -1 + "#); + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_status(101).with_stderr("\ +build.jobs must be positive, but found -1 in [..] +")); +}); + +test!(default_cargo_config_jobs { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + "#) + .file("src/lib.rs", "") + .file(".cargo/config", r#" + [build] + jobs = 1 + "#); + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_status(0)); +}); + +test!(good_cargo_config_jobs { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + "#) + .file("src/lib.rs", "") + .file(".cargo/config", r#" + [build] + jobs = 4 + "#); + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_status(0)); +}); -- 2.30.2